Use case: UART RX in DMA mode

Sequence diagram

UART receive in DMA mode

@startuml
participant " Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== initialization and configuration ==
== UART HAL Receive DMA ==
p1->p2: <color: green> HAL_UART_Receive_DMA(&huart, aRxBuffer, DATA_TO_RECEIVE_SIZE)
note over p2 #00FF00
Receiving data ongoing
end note
p2->p3: HAL_DMA_Start_IT()
p3-->p2: HAL_OK
p2-->p1: HAL_OK

p4<-: DMAx complete interrupt
p4->p3: HAL_DMA_IRQHandler
note over p3 #00FF00
End of receiving data
end note
p3->p2: XferCpltCallback
p2->p1: HAL_UART_RxCpltCallback(huart->rx_xfer_count)
@enduml

Code snippet

HAL1

HAL2

#define DATA_TO_RECEIVE_SIZE  255

UART_HandleTypeDef huart;

uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];


/* Ensure that all required peripherals
(USART, GPIO,NVIC,DMA etc.) are configured properly
/*
...
*/

/* UART register Receive complete user callback */
HAL_UART_RegisterCallback(&huart, HAL_UART_RX_CB_ID,
                          UART_RxCpltCallback);

/* Start a UART Process in dma mode */
HAL_UART_Receive_DMA(&huart, aRxBuffer,
                             DATA_TO_RECEIVE_SIZE)
#define DATA_TO_RECEIVE_SIZE  255

UART_HandleTypeDef huart;

uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];


/* Ensure that all required peripherals
  (UART, GPIO,NVI,DMA etc.) are configured properly
/*
...
*/

/* UART register Receive complete user callback */
HAL_UART_RegisterRxCpltCallback(&huart, UART_RxCpltCallback);


/* Start a UART Process in dma mode */
HAL_UART_Receive_DMA(&huart, aRxBuffer,
                         DATA_TO_RECEIVE_SIZE)

Key changes

  1. HAL2 DMA start uses HAL_DMA_StartPeriphXfer_IT_Opt() (optional interrupt generation) instead of HAL_DMA_Start_IT().

  2. HAL2 RX completion callback includes an RX event argument (for example HAL_UART_RXEVENT_TC).